//package com.zmj.mapper.base;
//
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.mongodb.core.MongoTemplate;
//import org.springframework.data.mongodb.core.query.Criteria;
//import org.springframework.data.mongodb.core.query.Query;
//import org.springframework.data.mongodb.core.query.Update;
//
//import java.lang.reflect.Field;
//import java.lang.reflect.Method;
//import java.util.List;
//
//public abstract class MongoDbBaseDao<T> {
//
//    protected abstract Class<T> getEntityClass();
//
//    @Autowired
//    private MongoTemplate mongoTemplate;
//
//
////    1、insert() ：用insert()方法，会抛出异常，插入数据的操作不会成功
////
////    2、save() ：用save() 方法，不会抛出异常，它会根据ID 更新 内容，类似于 update语句
//
//    /***
//     * 保存一个对象,存在id相同则报错
//     * @param t
//     */
//    public void save(T t) {
//        this.mongoTemplate.save(t);
//    }
//
//    /**
//     * 保存对象List到指定集合中
//     */
//    public void saveAll(List<T> list) {
//        this.mongoTemplate.insert(list, this.getEntityClass());
//    }
//
//
//    /**
//     * 保存单个对象到指定集合中
//     *
//     */
//    public void saveOne(T t) {
//        this.mongoTemplate.insert(t);
//    }
//
//    /***
//     * 根据id从几何中查询对象
//     * @param id
//     * @return
//     */
//    public T queryById(Integer id) {
//        Query query = new Query(Criteria.where("_id").is(id));
//
//        return this.mongoTemplate.findOne(query, this.getEntityClass());
//    }
//
//    /**
//     * 根据条件查询集合
//     *
//     * @param object
//     * @return
//     */
//    public List<T> queryList(T object) {
//        Query query = getQueryByObject(object);
//        return mongoTemplate.find(query, this.getEntityClass());
//    }
//
//    /**
//     * 根据条件查询只返回一个文档
//     *
//     * @param object
//     * @return
//     */
//    public T queryOne(T object) {
//        Query query = getQueryByObject(object);
//        return mongoTemplate.findOne(query, this.getEntityClass());
//    }
//
//    /***
//     * 根据条件分页查询
//     * @param object
//     * @param start 查询起始值
//     * @param size  查询大小
//     * @return
//     */
//    public List<T> getPage(T object, int start, int size) {
//        Query query = getQueryByObject(object);
//        query.skip(start);
//        query.limit(size);
//        return this.mongoTemplate.find(query, this.getEntityClass());
//    }
//
//    /***
//     * 根据条件查询库中符合条件的记录数量
//     * @param object
//     * @return
//     */
//    public Long getCount(T object) {
//        Query query = getQueryByObject(object);
//        return this.mongoTemplate.count(query, this.getEntityClass());
//    }
//
//    /***
//     * 删除对象
//     * @param t
//     * @return
//     */
//    public int delete(T t) {
//        return (int) this.mongoTemplate.remove(t).getDeletedCount();
//    }
//
//    /**
//     * 根据id删除
//     *
//     * @param id
//     */
//    public void deleteById(Integer id) {
//        Criteria criteria = Criteria.where("_id").is(id);
//        if (null != criteria) {
//            Query query = new Query(criteria);
//            T obj = this.mongoTemplate.findOne(query, this.getEntityClass());
//            if (obj != null) {
//                this.delete(obj);
//            }
//        }
//    }
//
//    /*MongoDB中更新操作分为三种
//     * 1：updateFirst     修改第一条
//     * 2：updateMulti     修改所有匹配的记录
//     * 3：upsert  修改时如果不存在则进行添加操作
//     * */
//
//    /**
//     * 修改匹配到的第一条记录
//     *
//     * @param srcObj
//     * @param targetObj
//     */
//    public void updateFirst(T srcObj, T targetObj) {
//        Query query = getQueryByObject(srcObj);
//        Update update = getUpdateByObject(targetObj);
//        this.mongoTemplate.updateFirst(query, update, this.getEntityClass());
//    }
//
//    /***
//     * 修改匹配到的所有记录
//     * @param srcObj
//     * @param targetObj
//     */
//    public void updateMulti(T srcObj, T targetObj) {
//        Query query = getQueryByObject(srcObj);
//        Update update = getUpdateByObject(targetObj);
//        this.mongoTemplate.updateMulti(query, update, this.getEntityClass());
//    }
//
//    /***
//     * 修改匹配到的记录，若不存在该记录则进行添加
//     * @param srcObj
//     * @param targetObj
//     */
//    public void updateInsert(T srcObj, T targetObj) {
//        Query query = getQueryByObject(srcObj);
//        Update update = getUpdateByObject(targetObj);
//        this.mongoTemplate.upsert(query, update, this.getEntityClass());
//    }
//
//    /**
//     * 将查询条件对象转换为query
//     *
//     * @param object
//     * @return
//     * @author Jason
//     */
//    private Query getQueryByObject(T object) {
//        Query query = new Query();
//        String[] fileds = getFiledName(object);
//        Criteria criteria = new Criteria();
//        for (int i = 0; i < fileds.length; i++) {
//            String filedName = (String) fileds[i];
//            Object filedValue = getFieldValueByName(filedName, object);
//            if (filedValue != null) {
//                criteria.and(filedName).is(filedValue);
//            }
//        }
//        query.addCriteria(criteria);
//        return query;
//    }
//
//    /**
//     * 将查询条件对象转换为update
//     *
//     * @param object
//     * @return
//     * @author Jason
//     */
//    private Update getUpdateByObject(T object) {
//        Update update = new Update();
//        String[] fileds = getFiledName(object);
//        for (int i = 0; i < fileds.length; i++) {
//            String filedName = (String) fileds[i];
//            Object filedValue = getFieldValueByName(filedName, object);
//            if (filedValue != null) {
//                update.set(filedName, filedValue);
//            }
//        }
//        return update;
//    }
//
//    /***
//     * 获取对象属性返回字符串数组
//     * @param o
//     * @return
//     */
//    private static String[] getFiledName(Object o) {
//        Field[] fields = o.getClass().getDeclaredFields();
//        String[] fieldNames = new String[fields.length];
//        for (int i = 0; i < fields.length; ++i) {
//            fieldNames[i] = fields[i].getName();
//        }
//        return fieldNames;
//    }
//
//    /***
//     * 根据属性获取对象属性值
//     * @param fieldName
//     * @param o
//     * @return
//     */
//    private static Object getFieldValueByName(String fieldName, Object o) {
//        try {
//            String e = fieldName.substring(0, 1).toUpperCase();
//            String getter = "get" + e + fieldName.substring(1);
//            Method method = o.getClass().getMethod(getter, new Class[0]);
//            return method.invoke(o, new Object[0]);
//        } catch (Exception var6) {
//            return null;
//        }
//    }
//}
